home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm2.lha / SORGENTI4 / LEZIONE8p2a.s / LEZIONE8p2a.s
Text File  |  1995-08-05  |  4KB  |  120 lines

  1.  
  2. ; Lezione8p2a.s        Flag e registri indirizzi
  3.  
  4.     SECTION    CondC,CODE
  5.  
  6. Inizio:
  7.     move.w    #$8000,d0
  8.     move.l    #$80000000,a0
  9. stop:
  10.     rts
  11.  
  12.     end
  13.  
  14.  
  15. ;       . · · .
  16. ;      .       .
  17. ;      .       .
  18. ;       .     .
  19. ;         · ·
  20.  
  21. In questa lezione ci occuperemo di una particolarita` dell'indirizzamento 
  22. diretto a registro indirizzi. Vedremo questa particolarita` utilizzando una
  23. istruzione MOVE nella quale per la destinazione e` usato l'indirizzamento
  24. diretto a registro indirizzi, ma essa si verifica con tutte le istruzioni che
  25. ammettono l'indirizzamento diretto a registro indirizzi per la destinazione.
  26.  
  27. Per prima cosa assemblate il programma ed eseguite la prima istruzione.
  28. Otterrete il seguente output:
  29.  
  30. D0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  31. A0: 80000000 00000000 00000000 00000000 00000000 00000000 00000000 07C9EDC4
  32. SSP=07C9FEF7 USP=07C9EDC4 SR=8004 T1 -- PL=0 --Z-- PC=07CA18DC
  33. PC=07CA18DC 207C80000000     MOVE.L  #$80000000,A0
  34. >
  35.  
  36. Come ci aspettavamo il flag "Z" ha assunto il valore 1.
  37. Eseguiamo anche la seconda istruzione:
  38.  
  39. D0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
  40. A0: 80000000 00000000 00000000 00000000 00000000 00000000 00000000 07C9EDC4 
  41. SSP=07C9FEF7 USP=07C9EDC4 SR=8004 T1 -- PL=0 --Z-- PC=07CA18E2
  42. PC=07CA18E2 4E75         RTS
  43. >
  44.  
  45. Notiamo che l'istruzione e` stata eseguita, ma che il flag "Z" vale ancora 1
  46. e il flag "N" vale invece 0. Eppure il valore $80000000 che abbiamo caricato
  47. nel registro A0 e` negativo! Dunque il nostro fido 680x0 si e` sbagliato?
  48. Ma naturalmente no! (Mica e` un Pentium 60! :). Il punto e` che come abbiamo
  49. gia` spiegato nella lezione 8, in realta` l'istruzione che si 
  50. occupa di copiare dati in un registro indirizzi e` la MOVEA, una variante
  51. della normale MOVE; l'ASMONE per comodita` ci consente di scrivere
  52. MOVE per copiare nei registri indirizzi, e si occupa lui di sostituire
  53. la MOVE con la MOVEA. Di solito noi non ci accorgiamo nemmeno di questa
  54. sostituzione. In questo caso pero` bisogna stare molto attenti perche`
  55. la MOVEA si comporta diversamente dalla MOVE per quanto riguarda la
  56. modifica dei CC. La MOVEA, come potete leggere in 68000-2.TXT, 
  57. lascia i CC TUTTI INALTERATI. Nel nostro caso, il flag "Z" valeva 1 prima
  58. dell'esecuzione della MOVE #$80000000,A0 e per questo motivo e` rimasto
  59. al valore 1. Verifichiamolo modificando la prima MOVE in
  60.  
  61.     move.w    #$8000,d0
  62.  
  63. Eseguendo PASSO PASSO notiamo che la prima MOVE fa assumere il valore 1
  64. al flag "N":
  65.  
  66. D0: 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
  67. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07CC685C 
  68. SSP=07CC798F USP=07CC685C SR=8008 T1 -- PL=0 -N--- PC=07CC9A60
  69. PC=07CC9A60 207C80000000     MOVE.L  #$80000000,A0
  70. >
  71.  
  72. E la MOVE.L #$80000000,A0 come abbiamo detto lascia inalterati i CC:
  73.  
  74. D0: 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
  75. A0: 80000000 00000000 00000000 00000000 00000000 00000000 00000000 07CC685C 
  76. SSP=07CC798F USP=07CC685C SR=8008 T1 -- PL=0 -N--- PC=07CC9A66
  77. PC=07CC9A66 4E75         RTS     
  78. >
  79.  
  80. Bisogna prestare particolare attenzione al fatto che i CC non vengono
  81. influenzati quando si indirizzano i registri indirizzi, perche` questo fatto
  82. puo` essere causa di BUG. Supponiamo per esempio di avere memorizzato un dato
  83. e di volerlo modificare in due modi diversi a seconda se esso sia positivo o
  84. negativo. Se spostiamo il dato in un registro dati, per esempio D0, possiamo
  85. scrivere il seguente frammento di codice:
  86.  
  87.     move.w    dato(pc),d0    ; modifica i CC in base al dato
  88.     bmi.s    dato_negativo
  89. dato_positivo:
  90.  ; operazioni da compiere se il dato e` positivo
  91.     bra.s    fine
  92.  
  93. dato_negativo:
  94.  ; operazioni da compiere se il dato e` negativo
  95. fine:
  96.     ; resto del programma
  97.  
  98. In questo caso come gia` sappiamo la MOVE provvede a settare i CC a seconda
  99. del segno del dato.
  100. Se invece dovessimo mettere il nostro dato in un registro indirizzi
  101. (es. A0) se scrivessimo una procedura analoga non funzionerebbe perche`
  102. la MOVEA non aggiorna correttamente i CC.
  103.  
  104.     move.w    dato(pc),a0    ; NON modifica i CC in base al dato !!
  105.     bmi.s    dato_negativo    ; Il salto viene effettuato in base allo
  106.                 ; stato dei CC precedente alla MOVE
  107. dato_positivo:
  108.     ; operazioni da compiere se il dato e` positivo
  109.     bra.s    fine
  110.  
  111. dato_negativo:
  112.     ; operazioni da compiere se il dato e` negativo
  113.  
  114. fine:
  115.     ; resto del programma
  116.  
  117. Una possibile soluzione al problema potrebbe essere di spostare il dato prima
  118. in un registro dati e successivamente in A0, oppure usare l'istruzione TST.
  119.  
  120.